#pragma once

#include <iostream>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include "Log.hpp"

// 通过 struct sockaddr_in 变量获取IP和port
class InetAddr
{
private:
    void getAddress(std::string& IP, uint16_t& port)
    {
        port = ntohs(_addr.sin_port);
        IP = inet_ntoa(_addr.sin_addr); 
    }

    
public:
    InetAddr(const struct sockaddr_in& addr)
        : _addr(addr)
    {
        getAddress(_IP, _port);
    }

    std::string IP() const
    {
        return _IP;
    }

    uint16_t Port() const
    {
        return _port;
    }

    struct sockaddr_in SockAddr() const
    {
        return _addr;
    }


    // 重载==操作符作为非成员函数  
    bool operator==(const InetAddr& other) const
    {  
        LOG(DEBUG, "判断两个用户是否相等");
        return _port == other._port && _IP == other._IP;  
    }

    // 重载!=操作符作为非成员函数  
    // bool operator!=(const InetAddr& other) const
    // {  
    //     return !(*this == other);  
    // }

    // bool operator<(const InetAddr& other) const
    // {
    //     return _port < other._port && _IP < other._IP;
    // }

    ~InetAddr() {}

private:
    struct sockaddr_in _addr;
    uint16_t _port;
    std::string _IP;
};